#导入相应的模块
import pygame
from pygame.locals import *  #pygame使用的各种常量
import time,random

'''
增加了英雄飞机上下移动的方法，并设置了移动范围
建立了敌机子弹的类
增加了敌机有针对性的瞄准开火功能，通过飞机的X坐标碰撞检测触发
通过设置子弹列表的长度控制子弹的速度和数量，英雄飞机6发，每架敌机4发
实现每架敌机子弹和英雄飞机的碰撞检测
实现每架敌机和英雄飞机的碰撞检测
实现英雄飞机的爆炸显示

'''
class HeroPlane:
	'''玩家飞机（英雄）'''
	def __init__(self,screen_temp):
		self.x = 200 #飞机初始位置
		self.y = 400
		self.screen = screen_temp
		self.image = pygame.image.load("./images/me.png")
		self.bullet_list =[] #用于存放玩家子弹列表
		self.boom_list =[]#用于存放爆炸图片列表
		self.boom_index = 0
		self.boom_num = 0


	def display(self):
		'''绘制玩家飞机和子弹'''
		#绘制子弹
		for b in self.bullet_list:
			b.display()
			if b.move():
				self.bullet_list.remove(b)
		#绘制飞机
		self.screen.blit(self.image,(self.x,self.y))
		

	def move_left(self):
		'''左移动飞机'''
		self.x -= 5
		if self.x<=0:
			self.x=0

	def move_right(self):
		'''右移动飞机'''
		self.x += 5
		if self.x>=406:
			self.x=406

	def move_up(self):                                    
		'''上移动飞机'''
		self.y -= 5
		if self.y<=100:
			self.y=100

	def move_down(self):
		'''下移动飞机'''
		self.y += 5
		if self.y>=400:
			self.y=400

	def fire(self):
		'''子弹发射'''
		if (len(self.bullet_list))<=5: #设置子弹列表的长度，控制子弹数量
			self.bullet_list.append(Bullet(self.screen,self.x,self.y))
		print(len(self.bullet_list))

	def creat_bomm(self):
		'''建立爆炸图像'''
		self.boom_list.append(pygame.image.load("./images/bao1.png"))
		self.boom_list.append(pygame.image.load("./images/bao2.png"))
		self.boom_list.append(pygame.image.load("./images/bao3.png"))
		self.boom_list.append(pygame.image.load("./images/bao4.png"))


	def boom(self):
		'''爆炸图像'''
		if self.boom_index < 4:
			self.screen.blit(self.boom_list[self.boom_index],(self.x,self.y))
			#延时
			while self.boom_num != 1000:
				self.boom_num += 1
			else:
				self.boom_index +=1



class Bullet:
	'''子弹类(英雄)'''
	def __init__(self,screen_temp,x,y):
		self.x = x+51  
		self.y = y
		self.screen = screen_temp
		self.image = pygame.image.load("./images/pd.png")

	def display(self):
		'''绘制子弹'''
		self.screen.blit(self.image,(self.x,self.y))

	def move(self):
		'''子弹移动'''
		self.y -= 10
		if self.y<=-20:
			return True

class EnemyPlane:
	'''敌机类'''
	def __init__(self,screen_temp):
		self.x = random.choice(range(408))  #0-408随机
		self.y = -75
		self.screen = screen_temp
		self.image = pygame.image.load("./images/e2.png")
		self.enbullet_list = []

	def display(self):
		'''绘制子弹和敌机'''
		for enbullet in self.enbullet_list:
			enbullet.display()
			if enbullet.move():
				self.enbullet_list.remove(enbullet)

		self.screen.blit(self.image,(self.x,self.y))


	def fire(self):
		if len(self.enbullet_list) <= 3:
			self.enbullet_list.append(EnBullet(self.screen,self.x,self.y))
		print(len(self.enbullet_list))


	def move(self,hero):
		'''敌机移动'''
		self.y += 4
		
		#敌机出屏幕
		if self.y>568:
			return True

		#遍历所有子弹,并执行碰撞检测
		for bo in hero.bullet_list:
			if bo.x>self.x+3 and bo.x<self.x+100 and bo.y>self.y+20:
				hero.bullet_list.remove(bo)
				return True

	def hero_die(self,hero):
		'''遍历敌机子弹，并执行碰撞检测'''
		for enbo in self.enbullet_list:
			if enbo.x>hero.x+3 and enbo.x<hero.x+100 and enbo.y>hero.y+15:
				self.enbullet_list.remove(enbo)
				return True

		
class EnBullet:
	'''子弹类(敌人)'''

	def __init__(self,screen_temp,x,y):
		self.x = x+50 
		self.y = y+57
		self.screen = screen_temp
		self.image = pygame.image.load("./images/pd.png")

	def display(self):
		'''绘制子弹'''
		self.screen.blit(self.image,(self.x,self.y))

	def move(self):
		'''子弹移动'''
		self.y += 8
		if self.y>=590:
			return True


def key_control(hero_temp):
	'''键盘控制函数'''
	#执行退出操作
	for event in pygame.event.get():
		if event.type == QUIT:
			print("exit()")
			exit()

	#获取按键信息
	pressed_keys = pygame.key.get_pressed()


	#做判断，并执行对象的操作
	if pressed_keys[K_LEFT] or pressed_keys[K_a]:
		print("left...")
		hero_temp.move_left()

	elif pressed_keys[K_RIGHT] or pressed_keys[K_d]:
		print("right...")
		hero_temp.move_right()

	elif pressed_keys[K_UP] or pressed_keys[K_w]:
		print("up...")
		hero_temp.move_up()

	elif pressed_keys[K_DOWN] or pressed_keys[K_s]:
		print("down...")
		hero_temp.move_down()

	if pressed_keys[K_SPACE]:
		print("space...")
		hero_temp.fire()
		

def main():
	'''主程序函数'''
	
	#创建游戏窗口
	screen = pygame.display.set_mode((512,568),0,0)

	#创建一个游戏背景
	background = pygame.image.load("./images/bg2.jpg")

	#创建玩家飞机（英雄）
	hero = HeroPlane(screen)
	
	m = -968
	enemylist = []
	boom_list = []



	while True:
		#绘制画面(画在窗口的坐标外面，窗口左上角为（0，0）坐标)
		screen.blit(background,(0,m))

		m+=2#Y轴朝下滚动，每次2个像素
		if m>=-200:#双图上下拼接1536/2=768，968-768=200
				#图像就无缝衔接重绘了
			m = -968 

		#绘制玩家飞机（英雄）
		hero.display()
		hero.creat_bomm()

		#执行键盘控制
		key_control(hero)

		#随机绘制敌机
		if random.choice(range(50)) == 10:
			enemylist.append(EnemyPlane(screen))
		#遍历敌机以及子弹
		for em in enemylist:
			em.display()

			#范围检测，自动瞄准开火
			if abs(em.x-hero.x)<=50:
				em.fire()

			#碰撞检测
			if em.x<hero.x+104 and em.x>hero.x-104 and em.y>hero.y-55:
				hero.boom()

			#子弹检测
			if em.hero_die(hero):
				hero.boom()

			#回收
			if em.move(hero):
				enemylist.remove(em)



		#更新显示
		pygame.display.update()

		#定时显示（每秒24帧，1/24大约0.04）
		time.sleep(0.04)




#判断当前是否是主运行程序，并调用
if __name__ == "__main__":
    main()
